8.3.2 编码JSON

我们要学习的处理JSON的第二个方面是,使用 json 包的 MarshalIndent 函数进行编码。这个函数可以很方便地将Go语言的 map 类型的值或者结构类型的值转换为易读格式的JSON文档。 序列化 (marshal)是指将数据转换为JSON字符串的过程。下面是一个将 map 类型转换为JSON字符串的例子,如代码清单8-31所示。

代码清单8-31 listing31.go

01 // 这个示例程序展示如何序列化JSON字符串
02 package main
03
04 import (
05   "encoding/json"
06   "fmt"
07   "log"
08 )
09
10 func main() {
11   // 创建一个保存键值对的映射
12   c := make(map[string]interface{})
13   c["name"] = "Gopher"
14   c["title"] = "programmer"
15   c["contact"] = map[string]interface{}{
16     "home": "415.333.3333",
17     "cell": "415.555.5555",
18   }
19
20   // 将这个映射序列化到JSON字符串
21   data, err := json.MarshalIndent(c, "", "  ")
22   if err != nil {
23     log.Println("ERROR:", err)
24     return
25   }
26
27   fmt.Println(string(data))
28 }

代码清单8-31展示了如何使用 json 包的 MarshalIndent 函数将一个 map 值转换为JSON字符串。函数 MarshalIndent 返回一个 byte 切片,用来保存JSON字符串和一个 error 值。下面来看一下 json 包中 MarshalIndent 函数的声明,如代码清单8-32所示。

代码清单8-32 golang.org/src/encoding/json/encode.go

// MarshalIndent很像Marshal,只是用缩进对输出进行格式化
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {

MarshalIndent 函数里再一次看到使用了空接口类型 interface{} 。函数 MarshalIndent 会使用反射来确定如何将 map 类型转换为JSON字符串。

如果不需要输出带有缩进格式的JSON字符串, json 包还提供了名为 Marshal 的函数来进行解码。这个函数产生的JSON字符串很适合作为在网络响应(如Web API)的数据。函数 Marshal 的工作原理和函数 MarshalIndent 一样,只不过没有用于前缀 prefix 和缩进 indent 的参数。

results matching ""

    No results matching ""